// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

// 防止头文件重复包含

#include "CommonInputTypeEnum.h"
#include "GameplayTagContainer.h"
#include "UObject/SoftObjectPtr.h"

// 包含所需头文件：
// - CommonInputTypeEnum: 通用输入类型枚举
// - GameplayTagContainer: 游戏标签容器
// - SoftObjectPtr: 软对象指针

#include "LyraMappableConfigPair.generated.h"

// UE代码生成头文件

class UPlayerMappableInputConfig;

// 前向声明类

/** 用于组织已加载的玩家可映射配置到其CommonUI输入类型的容器 */
USTRUCT(BlueprintType)  // 蓝图可见结构体
struct FLoadedMappableConfigPair
{
	GENERATED_BODY()

	FLoadedMappableConfigPair() = default;
	// 构造函数，初始化配置、类型和激活状态
	FLoadedMappableConfigPair(const UPlayerMappableInputConfig* InConfig, ECommonInputType InType, const bool InIsActive)
		: Config(InConfig)
		, Type(InType)
		, bIsActive(InIsActive)
	{}

	/** 应该应用到增强输入子系统的玩家可映射输入配置 */
	UPROPERTY(BlueprintReadOnly, VisibleAnywhere)  // 蓝图只读，任何地方可见
	TObjectPtr<const UPlayerMappableInputConfig> Config = nullptr;

	/** 此映射配置应该应用的设备类型 */
	UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
	ECommonInputType Type = ECommonInputType::Count;  // 默认为Count，表示无效类型

	/** 如果此配置当前处于激活状态。当拥有它的GFA激活时，配置被标记为激活 */
	UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
	bool bIsActive = false;  // 激活状态标志
};

/** 用于组织可能未加载的玩家可映射配置到其CommonUI输入类型的容器 */
USTRUCT()  // 普通结构体，不在蓝图中显示
struct FMappableConfigPair
{
	GENERATED_BODY()
	
	FMappableConfigPair() = default;  // 默认构造函数
	
	UPROPERTY(EditAnywhere)  // 在任何地方可编辑
	TSoftObjectPtr<UPlayerMappableInputConfig> Config;  // 软对象指针，支持异步加载

	/**
	 * 配置的类型。对于根据当前输入设备过滤配置很有用，
	 * 例如设置屏幕，或者只想在特定输入类型使用时应用此配置。
	 */
	UPROPERTY(EditAnywhere)
	ECommonInputType Type = ECommonInputType::Count;  // 输入类型，默认为无效

	/**
	 * 必须设置的平台特性容器，以便激活此输入。
	 * 
	 * 如果平台没有指定的特性之一，它仍然可以注册，但不能激活。
	 */
	UPROPERTY(EditAnywhere)
	FGameplayTagContainer DependentPlatformTraits;  // 依赖的平台特性

	/**
	 * 如果当前平台具有任何这些特性，则不会激活此配置。
	 */
	UPROPERTY(EditAnywhere)
	FGameplayTagContainer ExcludedPlatformTraits;  // 排除的平台特性

	/** 如果为true，则当关联的游戏功能激活时，此输入配置将自动激活。
	 * 这通常是期望的行为
	 */
	UPROPERTY(EditAnywhere)
	bool bShouldActivateAutomatically = true;  // 自动激活标志

	/** 根据当前平台特性和设置返回此配置对是否可以激活 */
	bool CanBeActivated() const;
	
	/**
	 * 使用本地设置注册给定的配置映射
	 */
	static bool RegisterPair(const FMappableConfigPair& Pair);

	/**
	 * 使用本地设置注销给定的配置映射
	 */
	static void UnregisterPair(const FMappableConfigPair& Pair);
};